/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.uca.sisbec.helpers.gastos;

import com.uca.sisbec.forms.gastos.GastosProyectosForm;
import com.uca.sisbec.mapping.GastosDeProyectos;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;

/**
 *
 * @author Alex
 */
public class GastosProyectosHelper {
    private Session session;

    public GastosProyectosHelper(Session session) {
        this.session = session;
    }
    
    public List<GastosDeProyectos> GetGastosProyectosMesActual(String estado, int op) {
        String hql = ConstruyeQueryGastosProyectos(estado,op);
        Query query = session.createQuery(hql);
        return new ArrayList<GastosDeProyectos>(query.list());
    }
    
    private String ConstruyeQueryGastosProyectos(String estado, int op) {
        String selectHQL = "";
        switch(op){
            case 1: selectHQL = "From GastosDeProyectos where year(fechaReg) = year(curdate()) and month(curdate()) = month(fechaReg) and extraordinario = 'NO' and estado = '" + estado + "'";
                    break;
            case 2: selectHQL = "From GastosDeProyectos where year(fechaReg) = year(curdate()) and month(curdate()) = month(fechaReg) and extraordinario = 'SI' and estado = '" + estado + "'";
                    break;
            case 3: selectHQL = "From GastosDeProyectos where year(fechaReg) = year(curdate()) and month(curdate()) = month(fechaReg) and estado = '" + estado + "'";
                    break;
        }
        return selectHQL;
    }
    
    public int RegistrarGastoProyectoDB(GastosProyectosForm gpf, String user){
        GastosDeProyectos gdp = new GastosDeProyectos();
        gdp.setExtraordinario(gpf.getExtraordinario());
        gdp.setMonto(BigDecimal.valueOf(gpf.getMonto()));
        gdp.setConcepto(gpf.getConcepto());
        gdp.setFechaReg(GetFechaActual());
        gdp.setUsuarioUltimoCambio(user);
        gdp.setFechaUltimoCambio(GetFechaActual());
        gdp.setEstado("REGISTRADO");
        gdp.setProyecto(gpf.getProyecto());
        session.save(gdp);
        return gdp.getIdGastosProyecto();
    }
    
    public void EliminarGastoProyectoDB(Integer idgp) {
        GastosDeProyectos gdp = (GastosDeProyectos) session.get(GastosDeProyectos.class, idgp);
        session.delete(gdp);
    }
    
    private java.sql.Timestamp GetFechaActual(){
        long timeNow = java.util.Calendar.getInstance().getTimeInMillis();
        java.sql.Timestamp ts = new java.sql.Timestamp(timeNow);
        return ts;
    }
    
    public List<GastosDeProyectos> BuscarGastosDeProyectosDB(GastosProyectosForm form) {
        String hql = "";
        if(form.getMonto() != 0) {
            hql = "From GastosDeProyectos where monto = :monto and concepto like :concepto and year(fechaReg) = year(curdate()) and month(curdate()) = month(fechaReg) and estado = 'REGISTRADO'";
        } else {
            hql = "From GastosDeProyectos where concepto like :concepto and year(fechaReg) = year(curdate()) and month(curdate()) = month(fechaReg) and estado = 'REGISTRADO'";
        }
        if(form.getProyecto().equals("FA") || form.getProyecto().equals("MU")){
            hql = hql + " and proyecto = :proyecto";
        }
        Query query = session.createQuery(hql);
        if(form.getMonto() != 0) {
            query.setDouble("monto", form.getMonto());
        }
        query.setString("concepto", "%"+form.getConcepto()+"%");
        if(form.getProyecto().equals("FA") || form.getProyecto().equals("MU")){
            query.setString("proyecto", form.getProyecto());
        }
        return new ArrayList<GastosDeProyectos>(query.list());
    }
    
    public void ModificarGastoProyDB(GastosProyectosForm form, String usuario) {
        GastosDeProyectos gdp = GetGastoProyDB(form.getIdGastosProyecto());
        gdp.setEstado(form.getEstado());
        gdp.setJustificacionCambio(form.getJustificacion());
        gdp.setUsuarioUltimoCambio(usuario);
        gdp.setFechaUltimoCambio(GetFechaActual());
        session.saveOrUpdate(gdp);
    }
    
    public void BuscarGastoDB(int idGp, GastosProyectosForm form) {
        GastosDeProyectos gdp = GetGastoProyDB(idGp);
        form.setIdGastosProyecto(gdp.getIdGastosProyecto());
        form.setConcepto(gdp.getConcepto());
        form.setMonto(gdp.getMonto().doubleValue());
        form.setJustificacion(gdp.getJustificacionCambio());
        form.setProyecto(gdp.getProyecto());
        form.setExtraordinario(gdp.getEstado());
    }
    
    public GastosDeProyectos GetGastoProyDB(int idGp) {
        GastosDeProyectos gdp = (GastosDeProyectos) session.get(GastosDeProyectos.class, idGp);
        return gdp;
    }
    
    public GastosDeProyectos EntregarGastoProyDB(int idGasto, String usuario) {
        GastosDeProyectos g = GetGastoProyDB(idGasto);
        g.setEstado("ENTREGADO");
        g.setUsuarioUltimoCambio(usuario);
        g.setFechaUltimoCambio(getFechaActual());
        session.saveOrUpdate(g);
        return g;
    }
    
    private java.sql.Timestamp getFechaActual(){
        long timeNow = java.util.Calendar.getInstance().getTimeInMillis();
        java.sql.Timestamp ts = new java.sql.Timestamp(timeNow);
        return ts;
    }
    
}
